package com.leetcode.partition5;

/**
 * @author `RKC`
 * @date 2021/10/2 9:57
 */
public class LC405数字转换为十六进制数 {

    public static String toHex(int num) {
        if (num == 0) return "0";
        StringBuilder sb = new StringBuilder();
        //负数的二进制等于其正数的二进制的反码(符号位也需要反)+1
        //16进制数的2进制有32个位，将其每4个分为一组，可以分为8组，负数的最高位不可能是0，因此不需要考虑前导0
        for (int i = 7; i >= 0; i--) {
            //将4个一组的二进制数分离出来，val就是该16进制位上的16进制数，与上0xf避免给右移后的左边0位当作二进制计算
            int val = (num >> 4 * i) & 0xf;
            //只有sb里面第一位不是存放的前导0，就可以将剩下的0放入
            if (sb.length() > 0 || val > 0) {
                char digit = val >= 10 ? (char) ('a' + val - 10) : (char) ('0' + val);
                sb.append(digit);
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println(toHex(16));
        System.out.println(Integer.toBinaryString(-16).length());
    }
}
